<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

</head>
<body>

</body>
</html>
<script>
// 英文
  // reduce：减少

const arr = [19, 18, 99, 12, 21, 1, 3];

/* reduce - 迭代函数 - 
    不会改变变量本身的值

回调函数的参数 四个：
  previousValue: accumulateValue
  currentValue:  
  currentIndex:  
  array: 


用法：
  回调函数 执行的第一次：
    1. 若没有 第二个参数（initial / init value），回调函数执行的第一次：accumulate 值为 arr[0], current 为 arr[1]
    2. 若有 第二个参数（initial / init value），回调函数执行的第一次：accumulate 值为 init value, current 为 arr[0]
  回调函数 执行的 第  N  >= 2 次：
    accumulate 为 回调函数，上一次 return 的值
    current 为 依次 遍历 数组的 item
*/


// 案例1：将 arr 返回为值 [{age: xx}, ...], xx 的值大于 18
// [19, 18, 99, 12, 21, 1, 3];  ->   [{age: 19}, {age: 99}, {age: 21}];

// 写法1：不写 initvalue 
const result1 = arr.reduce((accumulate, current, currentIndex) => {
  // 只考虑 第一次 迭代
    // 第一次迭代后，accumulate 必须是 数组
  if (currentIndex === 1) {

    // 若 accumulate 值 大于 18
    if (accumulate > 18) {
      accumulate = [{
        age: accumulate
      }];

      if (current > 18) {
        accumulate.push({
          age: current
        });
      }
    } else {
      // 若 accumulate 值 小于等于 18

      if (current > 18) {
        // 若 current 值  大于 18
        accumulate = [{
          age: current
        }];
      } else {
        accumulate = [];
      }
    }
  }

  // 第 大于等于 2 次迭代
  if (current > 18) {
    accumulate.push({
      age: current
    })
  }

  return accumulate;
});


// 写法2：使用 initvalue 
const result2 = arr.reduce((accu, current) => {
  if (current > 18) {
    accu.push({
      age: current
    })
  }

  return accu;
}, []);

console.log('result2', result2);

</script>